/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ve.usb.cep.db.models;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import ve.usb.cep.db.SelectObject;
import ve.usb.cep.db.SelectException;
import ve.usb.cep.db.Session;
import ve.usb.cep.db.domainObjects.Inscripcion;
import ve.usb.cep.db.modelExceptions.InscripcionException;
/**
 *
 * @author Andras
 */
public class InscripcionModel {
    Connection conn;
    PreparedStatement rowCountStatement;

    public Inscripcion set(Inscripcion curso)
        throws InscripcionException
    {
        if (0 == curso.getCodigo()){
            add(curso);
        }else{
            update(curso);
        }

        return curso;
    }

    public Inscripcion add(Inscripcion inscripcion)
        throws InscripcionException
    {

        conn = Session.connection();

        try{
            PreparedStatement pstmt = conn.prepareStatement("INSERT INTO inscripcion " +
                "(oferta, estudiante, pago, confirmada, descripcion, costo, curso)" +
                " VALUES (?, ?, ?, ?, ?, ?, ?)");

            pstmt.setInt(1, inscripcion.getOferta());
            pstmt.setInt(2, inscripcion.getEstudiante());
            if (-1 == inscripcion.getPago()){
                pstmt.setNull(3, java.sql.Types.INTEGER);
            }
            pstmt.setShort(4, inscripcion.getConfirmada());
            pstmt.setString(5, inscripcion.getDescripcion());
            pstmt.setInt(6, inscripcion.getCosto());
            pstmt.setInt(7, inscripcion.getCurso());

            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }
        return inscripcion;
    }

    public Inscripcion update(Inscripcion inscripcion)
        throws InscripcionException
    {

        conn = Session.connection();

        try{
            PreparedStatement pstmt = conn.prepareStatement("UPDATE inscripcion " +
              "SET oferta=?, estudiante=?, pago=?, confirmada=?, descripcion=?, costo=?, curso=? " +
              " WHERE codigo=?");

            pstmt.setInt(1, inscripcion.getOferta());
            pstmt.setInt(2, inscripcion.getEstudiante());
            if (-1 == inscripcion.getPago()){
                pstmt.setNull(3, java.sql.Types.INTEGER);
            }
            pstmt.setShort(4, inscripcion.getConfirmada());
            pstmt.setString(5, inscripcion.getDescripcion());
            pstmt.setInt(6, inscripcion.getEstudiante());
            pstmt.setInt(7, inscripcion.getCurso());
            pstmt.setInt(8, inscripcion.getCodigo());
            pstmt.executeUpdate();
        }catch(java.sql.SQLException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }
        return inscripcion;
    }

    public void delete(int codigo)
        throws InscripcionException
    {
        
        conn = Session.connection();
        try{
            PreparedStatement p = conn.prepareStatement("DELETE FROM inscripcion WHERE codigo=?");
            p.setInt(1, codigo);
            p.executeUpdate();
        }catch(SQLException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }
    }

    public ArrayList<Inscripcion> getCustom(SelectObject s) 
            throws InscripcionException {

        conn = Session.connection();
        s.setConnection(conn);

        s.setFields(Inscripcion.getFields());
        s.setTypes(Inscripcion.getTypes());
        s.setTable("inscripcion");

        PreparedStatement p;
        try{
            p = s.getSearchQuery();
            rowCountStatement = s.getCountQuery();
        }catch(SelectException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }

        ArrayList<Inscripcion> arr = new ArrayList<Inscripcion>();
        try{
            ResultSet rs = p.executeQuery();
            while (rs.next()){
                arr.add(new Inscripcion(
                    rs.getInt("codigo"),
                    rs.getInt("oferta"),
                    rs.getInt("estudiante"),
                    rs.getInt("pago"),
                    rs.getShort("confirmada"),
                    rs.getString("descripcion"),
                    rs.getInt("costo"),
                    rs.getInt("curso")
                ));
            }
        }catch(SQLException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }

        return arr;
    }

    public int getRowCount()
        throws InscripcionException
    {
        try{
            ResultSet rs = rowCountStatement.executeQuery();
            rs.next();
            return rs.getInt(1);
        }catch(SQLException e){
            e.printStackTrace();
            throw new InscripcionException(e.getMessage());
        }
    }
}
